package cl.mt.data;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Collection;
import java.util.LinkedList;

import cl.mt.dto.DTOOfertaVehiculo;
import cl.mt.mvc.action.transportista.helper.FiltroTransportistaDTO;
import cl.mt.util.bd.DatosTabla;
import cl.mt.util.bd.Parametro;

public class DataOfertaVehiculo extends DatosTabla {
	private static final String sqlGetId = "SELECT MAX(ID)+1 AS IDX FROM MASTRANSPORTE.MST_VEHICULOS_DISPONIBLE";
	private static final String sqlFindByPK = "SELECT ID, USR_ID, VHI_ID, REM_ID, FECHA_DESDE, COMENTARIOS, FECHA_PUBLICACION, FECHA_HASTA, ESTADO, CIU_ORG_ID, RGN_ORG_ID, PAI_DST_ID, RGN_DST_ID, CIU_DST_ID, PRECIO_REFERENCIAL, PAI_ORG_ID, ELIMINADO, MOT_ID, UNT_ID, FECHA_CADUCIDAD FROM MASTRANSPORTE.MST_VEHICULOS_DISPONIBLE where ID=?";
	private static final String sqlFindAll = "SELECT ID, USR_ID, VHI_ID, REM_ID, FECHA_DESDE, COMENTARIOS, FECHA_PUBLICACION, FECHA_HASTA, ESTADO, CIU_ORG_ID, RGN_ORG_ID, PAI_DST_ID, RGN_DST_ID, CIU_DST_ID, PRECIO_REFERENCIAL, PAI_ORG_ID, ELIMINADO, MOT_ID, UNT_ID, FECHA_CADUCIDAD FROM MASTRANSPORTE.MST_VEHICULOS_DISPONIBLE";
	private static final String sqlCreate = "INSERT INTO MASTRANSPORTE.MST_VEHICULOS_DISPONIBLE (ID, USR_ID, VHI_ID, REM_ID, FECHA_DESDE, COMENTARIOS, FECHA_PUBLICACION, FECHA_HASTA, ESTADO, CIU_ORG_ID, RGN_ORG_ID, PAI_DST_ID, RGN_DST_ID, CIU_DST_ID, PRECIO_REFERENCIAL, PAI_ORG_ID, ELIMINADO, MOT_ID, UNT_ID, FECHA_CADUCIDAD) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	private static final String sqlDeleteByPK = "DELETE FROM MASTRANSPORTE.MST_VEHICULOS_DISPONIBLE where ID=?";
	private static final String sqlUpdate = "UPDATE MASTRANSPORTE.MST_VEHICULOS_DISPONIBLE SET USR_ID=?, VHI_ID=?, REM_ID=?, FECHA_DESDE=?, COMENTARIOS=?, FECHA_PUBLICACION=?, FECHA_HASTA=?, ESTADO=?, CIU_ORG_ID=?, RGN_ORG_ID=?, PAI_DST_ID=?, RGN_DST_ID=?, CIU_DST_ID=?, PRECIO_REFERENCIAL=?, PAI_ORG_ID=?, ELIMINADO=?, MOT_ID=?, UNT_ID=?, FECHA_CADUCIDAD=? where ID=?";
	private static final String sqlFindByUserId = "SELECT ID, USR_ID, VHI_ID, REM_ID, FECHA_DESDE, COMENTARIOS, FECHA_PUBLICACION, FECHA_HASTA, ESTADO, CIU_ORG_ID, RGN_ORG_ID, PAI_DST_ID, RGN_DST_ID, CIU_DST_ID, PRECIO_REFERENCIAL, PAI_ORG_ID, ELIMINADO, MOT_ID, UNT_ID, FECHA_CADUCIDAD FROM MASTRANSPORTE.MST_VEHICULOS_DISPONIBLE where USR_ID=?";

	private DTOOfertaVehiculo setDatosRegistro(ResultSet rs) throws SQLException {
		DTOOfertaVehiculo dto = new DTOOfertaVehiculo();
		dto.setId(formatInteger(rs.getObject("ID")));
		dto.setIdUsuario(formatInteger(rs.getObject("USR_ID")));
		dto.setIdVehiculo(formatInteger(rs.getObject("VHI_ID")));
		dto.setIdRemolque(formatInteger(rs.getObject("REM_ID")));
		dto.setFechaDesde(formatDate(rs.getDate("FECHA_DESDE")));
		dto.setComentario(formatString(rs.getObject("COMENTARIOS")));
		dto.setFechaPublicacion(formatDate(rs.getDate("FECHA_PUBLICACION")));
		dto.setFechaHasta(formatDate(rs.getDate("FECHA_HASTA")));
		dto.setEstado(formatString(rs.getObject("ESTADO")));
		dto.setIdCiudadOrigen(formatInteger(rs.getObject("CIU_ORG_ID")));
		dto.setIdRegionOrigen(formatInteger(rs.getObject("RGN_ORG_ID")));
		dto.setIdPaisDestino(formatInteger(rs.getObject("PAI_DST_ID")));
		dto.setIdRegionDestino(formatInteger(rs.getObject("RGN_DST_ID")));
		dto.setIdCiudadDestino(formatInteger(rs.getObject("CIU_DST_ID")));
		dto.setPrecioReferencial(formatInteger(rs.getObject("PRECIO_REFERENCIAL")));
		dto.setIdPaisOrigen(formatInteger(rs.getObject("PAI_ORG_ID")));
		dto.setEliminado(formatString(rs.getObject("ELIMINADO")));
		dto.setIdTipoMoneda(formatInteger(rs.getObject("MOT_ID")));
		dto.setIdTipoUnidad(formatInteger(rs.getObject("UNT_ID")));
		dto.setFechaCaducidad(formatDate(rs.getDate("FECHA_CADUCIDAD")));
		return dto;
	}

	public Integer generateId() {
		Parametro[] params = null;
		Integer id = null;
		try {
			getConnection();
			ResultSet rs = executeQuery(sqlGetId, params);
			while (rs.next()) {
				id = formatInteger(rs.getObject("IDX"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}
		return id;
	}

	public DTOOfertaVehiculo findByPrimaryKey(Integer id) {

		DTOOfertaVehiculo dto = new DTOOfertaVehiculo();
		Parametro[] params = new Parametro[] { getParametro(id, Types.INTEGER) };
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlFindByPK, params);
			while (rs.next()) {
				dto = setDatosRegistro(rs);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return dto;
	}

	public Collection<DTOOfertaVehiculo> findAll() {

		Parametro[] params = null;
		Collection<DTOOfertaVehiculo> col = new LinkedList<DTOOfertaVehiculo>();
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlFindAll, params);
			while (rs.next()) {
				DTOOfertaVehiculo dto = setDatosRegistro(rs);
				col.add(dto);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return col;
	}

	public int deleteByPrimaryKey(Integer id) {

		Parametro[] params = new Parametro[] { getParametro(id, Types.INTEGER) };
		int res = -1;
		try {
			getConnection();
			res = executeUpdate(sqlDeleteByPK, params);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return res;
	}

	public int create(DTOOfertaVehiculo dto) {

		Parametro[] params = new Parametro[] {
			getParametro(dto.getId(), Types.INTEGER),
			getParametro(dto.getIdUsuario(), Types.INTEGER),
			getParametro(dto.getIdVehiculo(), Types.INTEGER),
			getParametro(dto.getIdRemolque(), Types.INTEGER),
			getParametro(formatTimestamp(dto.getFechaDesde()), Types.TIMESTAMP),
			getParametro(dto.getComentario(), Types.VARCHAR),
			getParametro(formatTimestamp(dto.getFechaPublicacion()), Types.TIMESTAMP),
			getParametro(formatTimestamp(dto.getFechaHasta()), Types.TIMESTAMP),
			getParametro(dto.getEstado(), Types.VARCHAR),
			getParametro(dto.getIdCiudadOrigen(), Types.INTEGER),
			getParametro(dto.getIdRegionOrigen(), Types.INTEGER),
			getParametro(dto.getIdPaisDestino(), Types.INTEGER),
			getParametro(dto.getIdRegionDestino(), Types.INTEGER),
			getParametro(dto.getIdCiudadDestino(), Types.INTEGER),
			getParametro(dto.getPrecioReferencial(), Types.VARCHAR),
			getParametro(dto.getIdPaisOrigen(), Types.INTEGER),
			getParametro(dto.getEliminado(), Types.VARCHAR),
			getParametro(dto.getIdTipoMoneda(), Types.INTEGER),
			getParametro(dto.getIdTipoUnidad(), Types.INTEGER),
			getParametro(formatTimestamp(dto.getFechaCaducidad()), Types.TIMESTAMP)
		};

		int res = -1;
		try {
			getConnection();
			res = executeUpdate(sqlCreate, params);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return res;
	}

	public int update(DTOOfertaVehiculo dto) {

		Parametro[] params = new Parametro[] {
			getParametro(dto.getIdUsuario(), Types.INTEGER),
			getParametro(dto.getIdVehiculo(), Types.INTEGER),
			getParametro(dto.getIdRemolque(), Types.INTEGER),
			getParametro(formatTimestamp(dto.getFechaDesde()), Types.TIMESTAMP),
			getParametro(dto.getComentario(), Types.VARCHAR),
			getParametro(formatTimestamp(dto.getFechaPublicacion()), Types.TIMESTAMP),
			getParametro(formatTimestamp(dto.getFechaHasta()), Types.TIMESTAMP),
			getParametro(dto.getEstado(), Types.VARCHAR),
			getParametro(dto.getIdCiudadOrigen(), Types.INTEGER),
			getParametro(dto.getIdRegionOrigen(), Types.INTEGER),
			getParametro(dto.getIdPaisDestino(), Types.INTEGER),
			getParametro(dto.getIdRegionDestino(), Types.INTEGER),
			getParametro(dto.getIdCiudadDestino(), Types.INTEGER),
			getParametro(dto.getPrecioReferencial(), Types.VARCHAR),
			getParametro(dto.getIdPaisOrigen(), Types.INTEGER),
			getParametro(dto.getEliminado(), Types.VARCHAR),
			getParametro(dto.getIdTipoMoneda(), Types.INTEGER),
			getParametro(dto.getIdTipoUnidad(), Types.INTEGER),
			getParametro(formatTimestamp(dto.getFechaCaducidad()), Types.TIMESTAMP),
			getParametro(dto.getId(), Types.INTEGER)
		};

		int res = -1;
		try {
			getConnection();
			res = executeUpdate(sqlUpdate, params);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return res;
	}

	public DTOOfertaVehiculo findByUserId(Long id) {

		DTOOfertaVehiculo dto = new DTOOfertaVehiculo();
		Parametro[] params = new Parametro[] { getParametro(id, Types.INTEGER) };
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlFindByUserId, params);
			while (rs.next()) {
				dto = setDatosRegistro(rs);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return dto;
	}

	public Collection<DTOOfertaVehiculo> findByFiltro(FiltroTransportistaDTO filtro) {

		int ind = 1;
		if (filtro.getFechaDesde() != null)
			ind++;
		if (filtro.getFechaHasta() != null)
			ind++;
		if (filtro.getIdPaisOrigen() != null)
			ind++;
		if (filtro.getIdRegionOrigen() != null)
			ind++;
		if (filtro.getIdPaisDestino() != null)
			ind++;
		if (filtro.getIdRegionDestino() != null)
			ind++;

		Parametro[] params = new Parametro[ind];

		String sqlFinal = sqlFindByUserId;
		String and = " AND";
		
		sqlFinal += and + " ELIMINADO='N'";
		if ("H".equals(filtro.getTipoFiltro())) {
			sqlFinal += and + " FECHA_HASTA<=CURRENT_DATE";
		} else {
			sqlFinal += and + " FECHA_HASTA>CURRENT_DATE";
		}

		params[0] = getParametro(filtro.getIdUsuario(), Types.INTEGER);
		ind = 1;
		if (filtro.getFechaDesde() != null) {
			sqlFinal += and + " FECHA_DESDE>?";
			params[ind++] = getParametro(formatTimestamp(filtro.getFechaDesde()), Types.TIMESTAMP);
			and = " AND";
		}
		if (filtro.getFechaHasta() != null) {
			sqlFinal += and + " FECHA_HASTA<=?";
			params[ind++] = getParametro(formatTimestamp(filtro.getFechaDesde()), Types.TIMESTAMP);
			and = " AND";
		}
		if (filtro.getIdPaisOrigen() != null) {
			sqlFinal += and + " PAI_ORG_ID=?";
			params[ind++] = getParametro(filtro.getIdPaisOrigen(), Types.INTEGER);
			and = " AND";
		}
		if (filtro.getIdRegionOrigen() != null) {
			sqlFinal += and + " RGN_ORG_ID=?";
			params[ind++] = getParametro(filtro.getIdRegionOrigen(), Types.INTEGER);
			and = " AND";
		}
		if (filtro.getIdPaisDestino() != null) {
			sqlFinal += and + " PAI_DST_ID=?";
			params[ind++] = getParametro(filtro.getIdPaisDestino(), Types.INTEGER);
			and = " AND";
		}
		if (filtro.getIdRegionDestino() != null) {
			sqlFinal += and + " RGN_DST_ID=?";
			params[ind++] = getParametro(filtro.getIdRegionDestino(), Types.INTEGER);
			and = " AND";
		}

		Collection<DTOOfertaVehiculo> col = new LinkedList<DTOOfertaVehiculo>();
		try {
			getConnection();

			ResultSet rs = executeQuery(sqlFinal, params);
			while (rs.next()) {
				DTOOfertaVehiculo dto = setDatosRegistro(rs);
				col.add(dto);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}

		return col;
	}
}
